﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PetShopService
{
    public class ProdutoServicos
    {
        BancoEntities oBanco = new BancoEntities();

        #region Produtos
        public void CadastrarProduto(int idProduto, string nome, decimal preco, int idCategoria, int idSubCategoria, string imagem, string detalhe, bool promocao, int idMarca, int saldo, int saldoMinimo)
        {
            
            Produto oProduto = oBanco.Produto.SingleOrDefault(p => p.idProduto == idProduto);

            if (oProduto == null) {
                oProduto = new Produto();
                oBanco.Produto.Add(oProduto);
            }
            
            oProduto.Saldo = saldo;
            oProduto.SaldoMinimo = saldoMinimo;
            oProduto.Nome = nome;
            oProduto.Preco = preco;
            oProduto.CategoriaProduto = oBanco.CategoriaProduto.Where(c => c.idCategoria == idCategoria).FirstOrDefault();
            oProduto.SubCategoriaProduto = oBanco.SubCategoriaProduto.Where(d => d.idSubCategoria == idSubCategoria).FirstOrDefault();
            oProduto.Imagem = imagem;
            oProduto.MarcaProduto = oBanco.MarcaProduto.Where(m => m.idMarca == idMarca).FirstOrDefault();
            oProduto.Promocao = promocao;
            oProduto.Detalhe = detalhe;
            
            oBanco.SaveChanges();
        }

        public List<Produto> RetornaListaProdutos(){
            return oBanco.Produto.OrderBy(d => d.idProduto).Take(12).ToList();
        }

        public List<Produto> RetornaListaProdutosPorIds(int[] idProdutos) {
            List<Produto> listaProdutos = new List<Produto>();
            foreach (int idProduto in idProdutos)
                listaProdutos.Add(oBanco.Produto.Where(p => p.idProduto == idProduto).SingleOrDefault());

             return listaProdutos;
        }

        public List<Produto> RetornaListaProdutosPorNome(string nomeProduto) {
            return oBanco.Produto.Where(p => p.Nome.Contains(nomeProduto)).ToList();
        }

        public List<Produto> RetornaListaProdutosPorCategoria(int idCategoria){
            return oBanco.Produto.Where(p => p.idCategoria == idCategoria).ToList();
        }

        public List<Produto> RetornaListaProdutosPorSubCategoria(int idSubCategoria) {
            return oBanco.Produto.Where(p => p.idSubCategoria == idSubCategoria).ToList();
        }

        public Produto RetornaProduto(int idProduto){
            return oBanco.Produto.SingleOrDefault(p => p.idProduto == idProduto);
        }

        public string RemoverProduto(int idProduto) {
            Produto produto = oBanco.Produto.SingleOrDefault(p => p.idProduto == idProduto);

            if (produto == null || produto.ItensCompra.Count != 0 || produto.ItensPedidos.Count != 0)
                return "Não é possivel remover o poduto porque ele está relacionado a uma compra ou a uma venda";

            oBanco.Produto.Remove(produto);
            oBanco.SaveChanges();

            return "Removido com sucesso";
        }

        #endregion

        #region Categoria
        public void CadastrarCategoria(int idCategoria, string descricaoCategoria){

            CategoriaProduto oCategoria = oBanco.CategoriaProduto.SingleOrDefault(c => c.idCategoria == idCategoria);
            
            if (oCategoria == null) {
                oCategoria = new CategoriaProduto();
                oBanco.CategoriaProduto.Add(oCategoria);
            }
            
            oCategoria.Descricao = descricaoCategoria;
            oBanco.SaveChanges();
        }

        public CategoriaProduto RetornaCategoria(int idCategoria) {
            return oBanco.CategoriaProduto.SingleOrDefault(c => c.idCategoria == idCategoria);
        }

        public List<SubCategoriaProduto> RetornaSubCateogiraPorCategoria(int idCategoria){
            return oBanco.SubCategoriaProduto.Where(s => s.idCategoria == idCategoria).ToList();
        }

        public List<CategoriaProduto> RetornaListaCategorias(){
            return oBanco.CategoriaProduto.ToList();
        }

        public string RemoverCategoria(int idCategoria) {
            CategoriaProduto categoria = oBanco.CategoriaProduto.SingleOrDefault(cat => cat.idCategoria == idCategoria);

            if (categoria == null || categoria.SubCategoriaProduto.Count != 0 || categoria.Produto.Count != 0)
                return "Não é possivel remover a categoria porque há uma ou mais sub categorias relacionados a ela";

            oBanco.CategoriaProduto.Remove(categoria);
            oBanco.SaveChanges();

            return "Removido com sucesso";
        }

        #endregion

        #region SubCategoria
        public void CadastrarSubCategoria(int idSubCategoria, string descricaoDepartamento, int idCategoria){

            SubCategoriaProduto subCategoria = oBanco.SubCategoriaProduto.SingleOrDefault(s => s.idSubCategoria == idSubCategoria);
           
            if(subCategoria == null){
                subCategoria = new SubCategoriaProduto();
                oBanco.SubCategoriaProduto.Add(subCategoria);
            }
            
            subCategoria.Descricao = descricaoDepartamento;
            subCategoria.CategoriaProduto = oBanco.CategoriaProduto.Single(c => c.idCategoria == idCategoria);
            oBanco.SaveChanges();
        }

        public SubCategoriaProduto RetornaSubCategoria(int idSubCategoria) {
            return oBanco.SubCategoriaProduto.Include("CategoriaProduto").Single(s => s.idSubCategoria == idSubCategoria);
        }

        public List<SubCategoriaProduto> RetornaListaSubCategoria() {
            return oBanco.SubCategoriaProduto.Include("CategoriaProduto").ToList();
        }

        public string RemoverSubCategoria(int idSubCategoria) {
            SubCategoriaProduto subCategoria = oBanco.SubCategoriaProduto.SingleOrDefault(sub => sub.idSubCategoria == idSubCategoria);
            
            if (subCategoria == null || subCategoria.Produto.Count != 0)
                return "Não é possivel remover uma sub categoria porque há produtos relacionados a ela";

            oBanco.SubCategoriaProduto.Remove(subCategoria);
            oBanco.SaveChanges();

            return "Removido com sucesso";
        }

        #endregion

        #region Marca
        
        public void CadastrarMarca(int idMarca, string descricaoMarca) {
            MarcaProduto oMarca = oBanco.MarcaProduto.SingleOrDefault(m => m.idMarca == idMarca);
            if (oMarca == null) {
                oMarca = new MarcaProduto();
                oBanco.MarcaProduto.Add(oMarca);
            }

            oMarca.descricao = descricaoMarca;
            oBanco.SaveChanges();
        }

        public List<MarcaProduto> RetornaListaMarca() {
            return oBanco.MarcaProduto.ToList();
        }

        public MarcaProduto RetornaMarcaProduto(int idMarca) {
            return oBanco.MarcaProduto.SingleOrDefault(m => m.idMarca == idMarca);
        }

        public string RemoverMarca(int idMarca) {
            MarcaProduto marca = oBanco.MarcaProduto.SingleOrDefault(m => m.idMarca == idMarca);

            if (marca == null || marca.Produto.Count != 0)
                return "Não é possivel remover uma Marca porque há produtos relacionados a ela";

            oBanco.MarcaProduto.Remove(marca);
            oBanco.SaveChanges();

            return "Removido com sucesso";
        }

        #endregion

    }
}
